1. SpringSecurity에서 로그인을 지원하는 방법
Spring security에서는 UserDEtailService 인터페이스를 구현하고 있는 클래스를 통해서 로그인 기능을 구현합니다.
UserDetailService를 통한 확장
서비스 부분에서 UserDetailService를 확장시키고 loadUserByUsername을 오버라이딩 한다.
SpringSecurity Config에서 로그인 정보를 설정해준다.
- Spring Security에서 인증은 AuthenticationManager를 통해 이루어지며 AuthenticationManagerBuilder이 생성해 줍니다. userDetailService를 구현하고 있는 객체로 MemberService를 지정해주며, Password Encoder을 지정해 줄 수 있습니다.
로그인 폼 작성 (login.html)
LoginController 설정 (MemberController)
2. 테스트 코드 작성
Spring Security test 의존성 추가
로그인 테스트 코드 작성
- MockMvc는 테스트에만 사용할 수 있는 객체를 사용할 수 있습니다.
- 해당 객체를 이용하면 웹 브라우저와 유사한 요청을 할 수 있습니다.
- userParameter()을 이용하면 이메일을 아이디로 세팅하고 로그인 URL에 요청합니다.
3. 로그인, 로그아웃 표시하기
헤더에서 로그인, 로그아웃 표시하기
thymeleaf에서는 spring-security와 연동하여 로그인, 로그아웃 시 표시할 요소들을 지정할 수 있습니다.
- 의존성 추가하기
- /fragment/headers.html 수정하기
4. 인가 페이지 구성하기
관리자가 접근 가능한 아이템 생성 페이지 만들기
- itemForm.html
- Controller
ajax 요청 설정하기
- 일반적인 접근 이외에도 ajax등 요청이 올 수 있다. 만약 해당 사항의 경우 헤더값에서 값을 읽어서 만약 인증정보가 없다면 401을 반환하고, 나머지는 로그인 페이지로 리 다이렉팅한다.
인가 페이지 설정
spring security configure 메서드에 HttpServletRequest를 처리할 옵션을 적는다.
- authroizeHttpRequest() 는 HttpServletRequest로 요청을 처리할 것을 명령하고
- permitAll() 앞에 붙어있는 경로는 접근을 허용한다는 것이다.,
- authenticated() 앞에 붙어 있는 경로는 인증이 필요한 것이다.(Admin)
대신 static 경로에 있는 디렉터리 하위 파일은 인증을 무시하도록 설정하자
5. 인가 페이지 테스트
- mockMvc에서는 @withMockUser을 사용하면 아이디가 admin이고 권한이 Admin인 유저로 접근할 수 있도록 합니다.
- 해당 페이지에 get요청을 보내고 응답값을 받아서 테스트 합니다.